home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / src / brailler-04b-c / brlr ƒ / Shell ƒ / window layer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-23  |  7.8 KB  |  318 lines  |  [TEXT/R*ch]

  1. #include "window layer.h"
  2. #include "graphics dispatch.h"
  3.  
  4. static    WindowPtr MyNewWindowDispatch(short layer, Boolean useColor,
  5.                 ExtendedWindowPtr storage, const Rect *boundsRect, ConstStr255Param title,
  6.                 short procID, Boolean goAwayFlag, long refCon);
  7. static    void SetFrontWindowInLayer(WindowPtr newWindow, WindowPtr oldFrontWindow,
  8.                 short layer);
  9. static    WindowPtr GetFrontWindowInLayer(short layer);
  10. static    void SetWindowPrevious(WindowPtr window, WindowPtr previousWindow);
  11. static    WindowPtr GetWindowPrevious(WindowPtr window);
  12. static    void SetWindowNext(WindowPtr window, WindowPtr nextWindow);
  13. static    WindowPtr GetWindowNext(WindowPtr window);
  14. static    void SetWindowLayer(WindowPtr window, short layer);
  15. static    short GetWindowLayer(WindowPtr window);
  16. static    pascal void MyHiliteWindow(WindowPtr theWindow, Boolean fHilite);
  17. static    void ActivateWindow(WindowPtr window, Boolean activate);
  18.  
  19. enum    /* window layers */
  20. {
  21.     kFloatLayer=0, kDocumentLayer
  22. };
  23.  
  24. #define NUM_LAYERS        2
  25. #define kMagicNumber    0x16435934
  26.  
  27. static    WindowPtr            gFrontWindowInLayer[NUM_LAYERS];
  28. static    UniversalProcPtr    gOldHiliteRoutine;
  29.  
  30. Boolean            gIgnoreNextActivateEvent;
  31.  
  32. void InitTheWindowLayer(void)
  33. {
  34.     short            i;
  35.     
  36.     for (i=0; i<NUM_LAYERS; i++)
  37.         gFrontWindowInLayer[i]=0L;
  38.     
  39.     InstallHilitePatch();
  40.     gIgnoreNextActivateEvent=FALSE;
  41. }
  42.  
  43. void ShutDownTheWindowLayer(void)
  44. {
  45. // well, no
  46. }
  47.  
  48. WindowPtr MyNewWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  49.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  50. {
  51.     return MyNewWindowDispatch(kDocumentLayer, FALSE, (ExtendedWindowPtr)wStorage, boundsRect,
  52.         title, procID, goAwayFlag, refCon);
  53. }
  54.  
  55. WindowPtr MyNewCWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  56.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  57. {
  58.     return MyNewWindowDispatch(kDocumentLayer, TRUE, (ExtendedWindowPtr)wStorage, boundsRect,
  59.         title, procID, goAwayFlag, refCon);
  60. }
  61.  
  62. WindowPtr MyNewFloatWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  63.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  64. {
  65.     return MyNewWindowDispatch(kFloatLayer, FALSE, (ExtendedWindowPtr)wStorage, boundsRect,
  66.         title, procID, goAwayFlag, refCon);
  67. }
  68.  
  69. WindowPtr MyNewFloatCWindow(void *wStorage, const Rect *boundsRect, ConstStr255Param title,
  70.     Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon)
  71. {
  72.     return MyNewWindowDispatch(kFloatLayer, TRUE, (ExtendedWindowPtr)wStorage, boundsRect,
  73.         title, procID, goAwayFlag, refCon);
  74. }
  75.  
  76. WindowPtr MyNewWindowDispatch(short layer, Boolean useColor,
  77.     ExtendedWindowPtr storage, const Rect *boundsRect, ConstStr255Param title, short procID,
  78.     Boolean goAwayFlag, long refCon)
  79. {
  80.     WindowPtr            window;
  81.     WindowPtr            oldFrontWindow;
  82.     WindowPtr            behind;
  83.     WindowPtr            iter, nextIter;
  84.     
  85.     behind=(WindowPtr)-1L;
  86.     if (layer==kDocumentLayer)
  87.     {
  88.         iter=GetFrontWindowInLayer(kFloatLayer);
  89.         if (iter!=0L)
  90.         {
  91.             while ((nextIter=GetWindowNext(iter))!=0L)
  92.                 iter=nextIter;
  93.             behind=iter;
  94.         }
  95.     }
  96.     
  97.     window=useColor ?
  98.             NewCWindow(storage, boundsRect, title, TRUE, procID, behind, goAwayFlag, refCon) :
  99.             NewWindow(storage, boundsRect, title, TRUE, procID, behind, goAwayFlag, refCon);
  100.     
  101.     oldFrontWindow=GetFrontWindowInLayer(layer);
  102.     RemoveHilitePatch();
  103.     if ((layer==kDocumentLayer) && (oldFrontWindow!=0L))
  104.         HiliteWindow(oldFrontWindow, FALSE);
  105.     HiliteWindow(window, TRUE);
  106.     InstallHilitePatch();
  107.     
  108.     if ((layer==kFloatLayer) && (GetFrontDocumentWindow()!=0L))
  109.         gIgnoreNextActivateEvent=TRUE;
  110.     
  111.     if ((layer==kDocumentLayer) && (oldFrontWindow!=0L))
  112.         ActivateWindow(oldFrontWindow, FALSE);
  113.     
  114.     storage->magic=kMagicNumber;        /* so we know it's one of ours */
  115.     SetWindowLayer(window, layer);
  116.     SetFrontWindowInLayer(window, oldFrontWindow, layer);
  117.     
  118.     return window;
  119. }
  120.  
  121. void MyDisposeWindow(WindowPtr window)
  122. {
  123.     WindowPtr        newFrontWindow;
  124.     short            layer;
  125.     
  126.     if (WindowHasLayer(window))
  127.     {
  128.         layer=GetWindowLayer(window);
  129.         newFrontWindow=GetWindowNext(window);
  130.         if (newFrontWindow!=0L)
  131.             SetWindowPrevious(newFrontWindow, 0L);
  132.         gFrontWindowInLayer[layer]=newFrontWindow;
  133.         CloseWindow(window);
  134.         DisposePtr((Ptr)window);
  135.         window=0L;
  136.         if (newFrontWindow!=0L)
  137.         {
  138.             RemoveHilitePatch();
  139.             HiliteWindow(newFrontWindow, TRUE);
  140.             InstallHilitePatch();
  141.             ActivateWindow(newFrontWindow, TRUE);
  142.         }
  143.     }
  144.     else
  145.     {
  146.         DisposeWindow(window);
  147.     }
  148. }
  149.  
  150. Boolean MySelectWindow(WindowPtr window)
  151. {
  152.     WindowPtr        nextWindow, previousWindow, oldFrontWindow;
  153.     short            layer;
  154.     WindowPtr        iter, nextIter;
  155.     
  156.     if (WindowHasLayer(window))
  157.     {
  158.         layer=GetWindowLayer(window);
  159.         oldFrontWindow=GetFrontWindowInLayer(layer);
  160.         if (oldFrontWindow!=window)
  161.         {
  162.             nextWindow=GetWindowNext(window);            /* might be 0L */
  163.             previousWindow=GetWindowPrevious(window);    /* guaranteed !=0L */
  164.             SetWindowNext(previousWindow, nextWindow);
  165.             if (nextWindow!=0L)
  166.                 SetWindowPrevious(nextWindow, previousWindow);
  167.             SetFrontWindowInLayer(window, oldFrontWindow, layer);
  168.         }
  169.         
  170.         if ((layer==kDocumentLayer) && ((iter=GetFrontWindowInLayer(kFloatLayer))!=0L))
  171.         {
  172.             while ((nextIter=GetWindowNext(iter))!=0L)
  173.                 iter=nextIter;
  174.             SendBehind(window, iter);
  175.         }
  176.         else
  177.         {
  178.             SelectWindow(window);
  179.         }
  180.         
  181.         if (oldFrontWindow==window)
  182.             return FALSE;
  183.         
  184.         RemoveHilitePatch();
  185.         if ((layer==kDocumentLayer) && (oldFrontWindow!=0L))
  186.         {
  187.             HiliteWindow(oldFrontWindow, FALSE);
  188.             ActivateWindow(oldFrontWindow, FALSE);
  189.         }
  190.         HiliteWindow(window, TRUE);
  191.         InstallHilitePatch();
  192.         ActivateWindow(window, TRUE);
  193.     }
  194.     else
  195.     {
  196.         SelectWindow(window);
  197.     }
  198.     
  199.     return TRUE;
  200. }
  201.  
  202. void SetFrontWindowInLayer(WindowPtr newWindow, WindowPtr oldFrontWindow,
  203.     short layer)
  204. {
  205.     if (newWindow!=0L)
  206.         SetWindowNext(newWindow, oldFrontWindow);
  207.     if (oldFrontWindow!=0L)
  208.         SetWindowPrevious(oldFrontWindow, newWindow);
  209.     if (newWindow!=0L)
  210.         SetWindowPrevious(newWindow, 0L);
  211.     gFrontWindowInLayer[layer]=newWindow;
  212. }
  213.  
  214. WindowPtr GetFrontWindowInLayer(short layer)
  215. {
  216.     return gFrontWindowInLayer[layer];
  217. }
  218.  
  219. void SetWindowPrevious(WindowPtr window, WindowPtr previousWindow)
  220. {
  221.     ((ExtendedWindowPtr)window)->previousWindow=previousWindow;
  222. }
  223.  
  224. WindowPtr GetWindowPrevious(WindowPtr window)
  225. {
  226.     return ((ExtendedWindowPtr)window)->previousWindow;
  227. }
  228.  
  229. void SetWindowNext(WindowPtr window, WindowPtr nextWindow)
  230. {
  231.     ((ExtendedWindowPtr)window)->nextWindow=nextWindow;
  232. }
  233.  
  234. WindowPtr GetWindowNext(WindowPtr window)
  235. {
  236.     return ((ExtendedWindowPtr)window)->nextWindow;
  237. }
  238.  
  239. void SetWindowLayer(WindowPtr window, short layer)
  240. {
  241.     ((ExtendedWindowPtr)window)->layer=layer;
  242. }
  243.  
  244. short GetWindowLayer(WindowPtr window)
  245. {
  246.     return ((ExtendedWindowPtr)window)->layer;
  247. }
  248.  
  249. Boolean WindowHasLayer(WindowPtr window)
  250. {
  251.     if (window==0L)
  252.         return FALSE;
  253.     else
  254.         return ((ExtendedWindowPtr)window)->magic==kMagicNumber;
  255. }
  256.  
  257. Boolean WindowIsFloat(WindowPtr window)
  258. {
  259.     if (window==0L)
  260.         return FALSE;
  261.     else
  262.         return ((ExtendedWindowPtr)window)->layer==kFloatLayer;
  263. }
  264.  
  265. WindowPtr GetFrontDocumentWindow(void)
  266. {
  267.     return GetFrontWindowInLayer(kDocumentLayer);
  268. }
  269.  
  270. WindowPtr GetIndWindowPtr(short index)
  271. {
  272.     WindowPtr        w;
  273.     short            i;
  274.     
  275.     for (i=NUM_LAYERS-1; i>=0; i--)
  276.     {
  277.         w=GetFrontWindowInLayer(i);
  278.         while ((w!=0L) && (GetWindowIndex(w)!=index))
  279.             w=GetWindowNext(w);
  280.         if (w!=0L)
  281.             return w;
  282.     }
  283.     
  284.     return 0L;
  285. }
  286.  
  287. void InstallHilitePatch(void)
  288. {
  289.     UniversalProcPtr    newAddress;
  290.     
  291.     gOldHiliteRoutine=GetToolTrapAddress(_HiliteWindow);
  292.     newAddress=(UniversalProcPtr)StripAddress(MyHiliteWindow);
  293.     SetToolTrapAddress(newAddress, (short)_HiliteWindow);
  294. }
  295.  
  296. void RemoveHilitePatch(void)
  297. {
  298.     SetToolTrapAddress(gOldHiliteRoutine, (short)_HiliteWindow);
  299. }
  300.  
  301. pascal void MyHiliteWindow(WindowPtr theWindow, Boolean fHilite)
  302. {
  303. }
  304.  
  305. void ActivateWindow(WindowPtr window, Boolean activate)
  306. {
  307.     GrafPtr            curPort;
  308.     
  309.     GetPort(&curPort);
  310.     SetPort(window);
  311.     if (activate)
  312.         ActivateWindowDispatch(GetWindowIndex(window));
  313.     else
  314.         DeactivateWindowDispatch(GetWindowIndex(window));
  315.     UpdateControls(window, window->visRgn);
  316.     SetPort(curPort);
  317. }
  318.